// #include <iostream>
// #include <vector>
// using namespace std;
// int m;
// vector<vector<int>> res;
// void dfs(int n, vector<int> a, int ans)
// {
//     if (n == 10)
//     {
//         if (ans == m)
//             res.push_back(a);
//         return;
//     }
//     for (int i = 1; i <= 3; i++)
//     {
//         a.push_back(i);
//         dfs(n + 1, a, ans + i);
//         a.pop_back();
//     }
// }
// int main()
// {
//     cin >> m;
//     if (m > 30)
//     {
//         cout << 0;
//         return 0;
//     }
//     vector<int> t;
//     dfs(0, t, 0);
//     int k = res.size();
//     cout << k << endl;
//     for (int i = 0; i < k; i++)
//     {
//         for (auto &s : res[i])
//         {
//             cout << s << " ";
//         }
//         cout << endl;
//     }
//     return 0;
// }

// 优化版本，这个更好哈哈
#include <iostream>
#include <vector>
using namespace std;

int m;
vector<vector<int>> res;

void dfs(int n, vector<int>& a, int ans) {
    if (ans > m || ans + (10 - n) * 1 > m || ans + (10 - n) * 3 < m)
        return;

    if (n == 10) {
        if (ans == m)
            res.push_back(a);
        return;
    }

    for (int i = 1; i <= 3; i++) {
        a.push_back(i);
        dfs(n + 1, a, ans + i);
        a.pop_back(); // 回溯
    }
}

int main() {
    cin >> m;
    if (m > 30 || m < 10) { // 总和最少是10（全是1g），最多是30（全是3g）
        cout << 0 << endl;
        return 0;
    }

    vector<int> a;
    dfs(0, a, 0);

    cout << res.size() << endl;
    for (const auto& r : res) {
        for (int v : r) {
            cout << v << " ";
        }
        cout << endl;
    }
    return 0;
}
